package gui_BM;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.SQLException;
import java.util.regex.PatternSyntaxException;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.JTable;
import javax.swing.JOptionPane;
import javax.swing.JButton;
import javax.swing.Box;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.table.TableRowSorter;
import javax.swing.table.TableModel;

import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class TelaListaEncomendas extends JFrame {
	 // database URL, username and password
	   static final String DATABASE_URL = "jdbc:postgresql://localhost:5432/BasicManagement";
	   static final String USERNAME = "postgres";
	   static final String PASSWORD = "*88233495*";
	   
	   // default query retrieves all data from clientes table
	   static final String DEFAULT_QUERY = "SELECT * FROM encomendas";
	   
	   private TabelaConsulta tableModel;
	   private JTextArea queryArea;
	   
	   // create TabelaConsulta and GUI
	   public  TelaListaEncomendas() throws ClassNotFoundException   {   
	      super( "Displaying Query Results" );
	      setTitle("Resultados da Busca");
	        
	      // create TabelaConsulta and display database table
	      try 
	      {
	         // create TableModel for results of query SELECT * FROM item_de_estoque
	         tableModel = new TabelaConsulta(DEFAULT_QUERY );

	         // set up JTextArea in which user types queries
	         queryArea = new JTextArea( DEFAULT_QUERY, 3, 100 );
	         queryArea.setWrapStyleWord( true );
	         queryArea.setLineWrap( true );
	         
	         JScrollPane scrollPane = new JScrollPane( queryArea,
	            ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 
	            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );
	         
	         // set up JButton for submitting queries
	         JButton submitButton = new JButton( "Submit Query" );

	         // create Box to manage placement of queryArea and 
	         // submitButton in GUI
	         Box boxNorth = Box.createHorizontalBox();
	         boxNorth.add( scrollPane );
	         boxNorth.add( submitButton );

	         // create JTable based on the tableModel
	         JTable resultTable = new JTable( tableModel );
	         
	         JLabel filterLabel = new JLabel( "Filter:" );
	         final JTextField filterText = new JTextField();
	         JButton filterButton = new JButton( "Apply Filter" );
	         Box boxSouth = Box.createHorizontalBox();
	         
	         boxSouth.add( filterLabel );
	         boxSouth.add( filterText );
	         boxSouth.add( filterButton );
	         
	         // place GUI components on content pane
	         getContentPane().add( boxNorth, BorderLayout.NORTH );
	         getContentPane().add( new JScrollPane( resultTable ), BorderLayout.CENTER );
	         getContentPane().add( boxSouth, BorderLayout.SOUTH );

	         // create event listener for submitButton
	         submitButton.addActionListener( 
	         
	            new ActionListener() 
	            {
	               // pass query to table model
	               public void actionPerformed( ActionEvent event )
	               {
	                  // perform a new query
	                  try 
	                  {
	                     tableModel.setQuery( queryArea.getText() );
	                  } // end try
	                  catch ( SQLException sqlException ) 
	                  {
	                     JOptionPane.showMessageDialog( null, 
	                        sqlException.getMessage(), "Database error", 
	                        JOptionPane.ERROR_MESSAGE );
	                     
	                     // try to recover from invalid user query 
	                     // by executing default query
	                     try 
	                     {
	                        tableModel.setQuery( DEFAULT_QUERY );
	                        queryArea.setText( DEFAULT_QUERY );
	                     } // end try
	                     catch ( SQLException sqlException2 ) 
	                     {
	                        JOptionPane.showMessageDialog( null, 
	                           sqlException2.getMessage(), "Database error", 
	                           JOptionPane.ERROR_MESSAGE );
	         
	                        // ensure database connection is closed
	                       tableModel.disconnectFromDatabase();
	         
	                        System.exit( 1 ); // terminate application
	                     } // end inner catch                   
	                  } // end outer catch
	               } // end actionPerformed
	            }  // end ActionListener inner class          
	         ); // end call to addActionListener
	         
	         final TableRowSorter< TableModel > sorter = 
	            new TableRowSorter< TableModel >( tableModel );
	         resultTable.setRowSorter( sorter );
	         setSize( 500, 250 ); // set window size
	         setVisible( true ); // display window  
	         
	         // create listener for filterButton
	         filterButton.addActionListener(            
	            new ActionListener() 
	            {
	               // pass filter text to listener
	               public void actionPerformed( ActionEvent e ) 
	               {
	                  String text = filterText.getText();

	                  if ( text.length() == 0 )
	                     sorter.setRowFilter( null );
	                  else
	                  {
	                     try
	                     {
	                        sorter.setRowFilter( 
	                           RowFilter.regexFilter( text ) );
	                     } // end try
	                     catch ( PatternSyntaxException pse ) 
	                     {
	                        JOptionPane.showMessageDialog( null,
	                           "Bad regex pattern", "Bad regex pattern",
	                           JOptionPane.ERROR_MESSAGE );
	                     } // end catch
	                  } // end else
	               } // end method actionPerfomed
	            } // end annonymous inner class
	         ); // end call to addActionLister
	      } // end try
	      catch ( SQLException sqlException ) 
	      {
	         JOptionPane.showMessageDialog( null, sqlException.getMessage(), 
	            "Database error", JOptionPane.ERROR_MESSAGE );
	               
	         // ensure database connection is closed
	        tableModel.disconnectFromDatabase();
	         
	         System.exit( 1 ); // terminate application
	      } // end catch
	      
	      // dispose of window when user quits application (this overrides
	      // the default of HIDE_ON_CLOSE)
	      setDefaultCloseOperation( DISPOSE_ON_CLOSE );
	      
	      // ensure database connection is closed when user quits application
	      addWindowListener(
	      
	         new WindowAdapter() 
	         {
	            // disconnect from database and exit when window has closed
	            public void windowClosed( WindowEvent event )
	            {
	               tableModel.disconnectFromDatabase();
	               System.exit( 0 );
	            } // end method windowClosed
	         } // end WindowAdapter inner class
	      ); // end call to addWindowListener
	   }// end TelaConsultaEstoque constructor
	   
	   // execute application
	   public static void main( String args[] ) throws ClassNotFoundException 
	   {
	      new TelaConsultaEstoque();     
	   }

}
